package com.alibaba.cloud.ai.example.helloworld.controller;

import com.alibaba.cloud.ai.dashscope.chat.DashScopeChatOptions;
import com.alibaba.cloud.ai.example.helloworld.advisor.LoggingAdvisor;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.ai.chat.client.ChatClient;
import org.springframework.ai.chat.client.advisor.PromptChatMemoryAdvisor;
import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;
import org.springframework.ai.chat.memory.ChatMemory;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDate;

import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_CONVERSATION_ID_KEY;
import static org.springframework.ai.chat.client.advisor.AbstractChatMemoryAdvisor.CHAT_MEMORY_RETRIEVE_SIZE_KEY;

/**
 * @author yuluo
 * @author <a href="mailto:yuluo08290126@gmail.com">yuluo</a>
 */

@CrossOrigin
@RestController
@RequestMapping("/log")
public class Test04LogController {

    private final ChatClient dashScopeChatClient;

    // 也可以使用如下的方式注入 ChatClient
    public Test04LogController(ChatClient.Builder chatClientBuilder, ChatMemory chatMemory) {
        this.dashScopeChatClient = chatClientBuilder.defaultSystem("""
                        您是TuLing航空公司的客户聊天支持代理。
                        请以友好、乐于助人且愉快的方式来回复。
                        您正在通过在线聊天系统与客户互动。
                        请讲中文。
                        """)

                // 实现 Chat Memory 的 Advisor
                // 在使用 Chat Memory 时，需要指定对话 ID，以便 Spring AI 处理上下文。
                .defaultAdvisors(new PromptChatMemoryAdvisor(chatMemory),
                        new LoggingAdvisor()
                )
                // 实现 Logger 的 Advisor
                .defaultAdvisors(new SimpleLoggerAdvisor())
                // 设置 ChatClient 中 ChatModel 的 Options 参数
                .defaultOptions(DashScopeChatOptions.builder().withTopP(0.7).build()).build();
    }

    /**
     * ChatClient 简单调用-设置user
     */
    @GetMapping("/simple/chat")
    public String simpleChat(@RequestParam(value = "query", defaultValue = "你好，很高兴认识你，能简单介绍一下自己吗？") String query) {
        return this.dashScopeChatClient.prompt().user(query).system(systemSpec -> systemSpec.param("current_date", LocalDate.now().toString())).call().content();
    }

    /**
     * ChatClient 简单调用-设置advisors拦截器
     */
    @GetMapping("/simple/chat2")
    public String advisorChat(HttpServletResponse response, @PathVariable String sessionId, @RequestParam String query) {
        response.setCharacterEncoding("UTF-8");

        return this.dashScopeChatClient.prompt(query).advisors(systemSpec -> systemSpec.param(CHAT_MEMORY_CONVERSATION_ID_KEY, sessionId).param(CHAT_MEMORY_RETRIEVE_SIZE_KEY, 100)).call().content();
    }
}
